# 这里的函数实现了我们点击登录后，服务器返回给客户端的的数据 token,id,username　
# 拿到返回数据　保持登陆状态信息

# 登陆接口视图里面本来默认只返回token 这里实现修改登录成功后接口返回的响应参数，
#  并且新增补充上 user_id 和 username两个字段一并返回
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q

from users.models import User


def jwt_response_payload_handler(token, user=None, request=None):
    """
    自定义jwt认证成功返回数据
    我们直接调用实现路由视图的obtain_jwt_token包里的方法jwt_response_payload_handler来实现

    """
    return {
        'token': token,
        'user_id': user.id,
        'username': user.username
    }



# 自定义的后台　重写它里面认证后台的方法　实现用户名也可以用手机号登陆
# ModelBackend这个类是django默认的登录页面校验的后台(管理类)
class UsernameMobileAuthBackend(ModelBackend):

    def authenticate(self, request, username=None, password=None, **kwargs):
        """
        # 根据传过来的用户名密码去redis中校验取出满足条件的数据返回客户端
        # 判断传来的数据用户名/手机号　密码是否正确　

        :param request:
        :param username:  用户名或手机号
        :param password: 　密码
        :param kwargs:
        :return:
        """
        # 通过用户名和手机号查询用户这条数据　查询对应的用户数据
        #  这里的Ｑ对象指定只要满足了手机号与用户名任意一种都查询出来　表示或的关系
        query_set = User.objects.filter(Q(username=username)|Q(mobile=username))
        try:
            if query_set.exists():  # 如果有查询到数据
                user = query_set.get()  # 就取出查询到的唯一一条数据
                # 如果查询到了用户这条数据
                if user:
                    # 就判断密码是否正确
                    if user.check_password(password):
                        return user  # 表示用户名(手机号)正确，返回用户对象
        except:
            return None  # 如果没查询到数据就返回空

        return None


